package threadTest.synchronizedTest;

import java.util.ArrayList;
import java.util.List;

/**
 * 功能描述:       保证 消费,和生产在同一个类中,  即 等待和通知 在同一个类
 * 2024/02/21
 * <p>
 * ZhangYi
 */
public class DataContainer {
    /**
     * max num
     */
    private int MAX_NUM;

    /**
     * id
     */
    private int id = 0;
    private List<Chicken> chickens;

    public DataContainer(int MAX_NUM ) {
        this.MAX_NUM = MAX_NUM;
        this.chickens = new ArrayList<>(MAX_NUM);
    }

    /**
     * 生产
     *
     * @author ZhangYi
     */
    public synchronized void produce() throws InterruptedException {
        while (chickens.size() > this.MAX_NUM) {
            this.wait(); // 如果鸡的数量 到达了10 ， 则生产者等待
        }

        Chicken e = new Chicken(id,
                                "小鸡" + id++);
        chickens.add(e); // 生产小鸡
        System.out.println(Thread.currentThread().getName() + " 生产小鸡信息 " + e.toString());
        this.notifyAll();  // 通知消费者
    }


    /**
     * 消费者
     *
     * @author ZhangYi
     */
    public synchronized void consume() throws InterruptedException {
        while (chickens.isEmpty()){
            this.wait(); //  如果 缓存区中没有小鸡， 则消费者等待
        }

        Chicken chicken = chickens.get(0);
        chickens.remove(chicken);
        System.out.println(Thread.currentThread().getName()+" 消费小鸡 "+ chicken.toString());
        this.notifyAll();
    }
}
